/**
 * JS API
 */
import dataUpdater from './dataUpdater'

let onceloding=true;
class datafeeds {

  /**
   * JS API
   * @param {*Object} vue vue实例
   */
  constructor(vue) {
    this.self = vue
    this.barsUpdater = new dataUpdater(this)
  }

  /**
   * @param {*Function} callback  回调函数
   * `onReady` should return result asynchronously.
   */

   //首次加载图表时，JS API流程如下所示：
   //1. onReady被调用，通过数据传送专线的配置选项来cb
   //2. resolveSymbol被调用，通过symbolInfo对象到onSymbolResolvedCallback
   //3. getBars调用，以UTC时间传递ohlcv对象数组，以毫秒为单位onHistoryCallback

  onReady(callback) {  
    //在图表小部件初始化之后立即调用,必须将datafeed配置选项传递给onReady cb函数,要异步执行的。
    //configuration：{exchanges:{},symbols_types:{},supported_resolutions:{},supports_marks:{},supports_timescale_marks:{},supports_time{}}
    //exchanges:一个对象，value，name，desc。 =>  value 被作为exchang传递给 searchSymbols （查询商品） 
    //symbols_types：一个商品类型过滤器数组，过滤器是个对象{name,value} value 会被sybolType传递给 searchSymbols
    //supported_resolutions：表示服务器支持的周期数组，数字或字符串。数字时回被视为分钟，字符可用是D，W, _M _的意思是任何数自。
    //supports_marks：布尔值来标识datafeedK线上显示标记
    //supports_timescale_marks  是否支持时间刻度标记
  
    return new Promise((resolve, reject) => {
      let configuration = this.defaultConfiguration()
      if (this.self.getConfig) {  //vue组件中如果设置配置就合并对象
        configuration = Object.assign(this.defaultConfiguration(), this.self.getConfig())
      }
      resolve(configuration)
    }).then(data => callback(data))   
  }

  /**
   * @param {*String} symbolName  商品名称或ticker
   * @param {*Function} onSymbolResolvedCallback 成功回调 
   * @param {*Function} onResolveErrorCallback   失败回调
   * `resolveSymbol` should return result asynchronously.
   */
  resolveSymbol(symbolName, onSymbolResolvedCallback, onResolveErrorCallback) {
    //配置数据源后，必须返回表示相应符号的symbolInfo对象。
    
    return new Promise((resolve, reject) => {
      let symbolInfo = this.defaultSymbol()
      onceloding=false;
      if (this.self.getSymbol) {
        symbolInfo = Object.assign(this.defaultSymbol(), this.self.getSymbol())
      }
      // this.setSymbolCall=onSymbolResolvedCallback;
      // this.defaultSymbol=symbolInfo\
      resolve(symbolInfo)   //通过商品名字解析
    }).then(data => onSymbolResolvedCallback(data)).catch(err => onResolveErrorCallback(err))
  }

  /**
   * @param {*Object} symbolInfo  商品信息对象
   * @param {*String} resolution  分辨率
   * @param {*Number} rangeStartDate  时间戳、最左边请求的K线时间
   * @param {*Number} rangeEndDate  时间戳、最右边请求的K线时间
   * @param {*Function} onDataCallback  回调函数
   * @param {*Function} onErrorCallback  回调函数
   */
  getBars(symbolInfo, resolution, rangeStartDate, rangeEndDate, onDataCallback, onErrorCallback) {
    //从我们的API源获取图表数据并将其交给TradingView
    const onLoadedCallback = data => {
      data && data.length ? onDataCallback(data, { noData: false }) : onDataCallback([], { noData: true })
    }

    this.self.getBars(symbolInfo, resolution, rangeStartDate, rangeEndDate, onLoadedCallback)
  }
  /**
   * 订阅K线数据。图表库将调用onRealtimeCallback方法以更新实时数据
   * @param {*Object} symbolInfo 商品信息
   * @param {*String} resolution 分辨率
   * @param {*Function} onRealtimeCallback 回调函数 
   * @param {*String} subscriberUID 监听的唯一标识符
   * @param {*Function} onResetCacheNeededCallback (从1.7开始): 将在bars数据发生变化时执行
   */
  subscribeBars(symbolInfo, resolution, onRealtimeCallback, subscriberUID, onResetCacheNeededCallback) {
     this.barsUpdater.subscribeBars(symbolInfo, resolution, onRealtimeCallback, subscriberUID, onResetCacheNeededCallback)
  }

  /**
   * 取消订阅K线数据
   * @param {*String} subscriberUID 监听的唯一标识符
   */
  unsubscribeBars(subscriberUID) {
    this.barsUpdater.unsubscribeBars(subscriberUID)
  }

  /**
   * 默认配置
   */
  defaultConfiguration() {
    return {
      supports_search: true,
      supports_group_request: true,
      supported_resolutions: ['1', '5', '30', '60', '1D', '1W', '1M'],
      supports_marks: true,
      supports_timescale_marks: true,
      supports_time: true
    }
  }

  /**
   * 默认商品信息
   */
  defaultSymbol() {
    // console.log(this.self.pricescale) this.self.pricescale.num,
     let num=Number(localStorage.getItem('pricescale'))
    //  let data= this.self.pricescale.num 
    //      data !=null ? '':data=localStorage.getItem('pricescale')
    return {
      'name': this.self.symbol,
      'timezone': 'Asia/Shanghai',
      'minmov': 1,
      'minmov2': 0,
      'pointvalue': 1,
      'fractional': false,
      'session': '24x7',
      'has_intraday': true,
      'has_no_volume': false,
      "has_daily":true,
      "has_weekly_and_monthly":true,
      'description': this.self.symbol,
      'pricescale' :onceloding ? num!='' ? num:100000:this.self.pricescale.num,
      'ticker': this.self.symbol,
      'supported_resolutions':  ['1', '5', '30', '60', '1D', '1W', '1M'],
    }
  }
}

export default datafeeds